<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>20.面向对象的封装与抽象</title>
</head>

<body>
  <script>
    //下例将对象属性封装到构造函数内部
    function User (name, age) {
      this.name = name;
      this.age = age;
      this.info = function () {
        return this.age > 50 ? "中年人" : "年轻人";
      };
      this.about = function () {
        return `${this.name}是${this.info()}`;
      };
    }
    let lisi = new User("李四", 22);
    console.log(lisi.about());
    //上例中的方法和属性仍然可以在外部访问到，比如 info方法只是在内部使用，不需要被外部访问到这会破坏程序的内部逻辑。

    //  下面使用闭包特性将对象进行抽象处理
    function User2 (name, age) {
      let data = { name, age };
      let info = function () {
        return data.age > 50 ? "中年人" : "年轻人";
      };
      this.message = function () {
        return `${data.name}是${info()}`;
      };
    }
    let lisi2 = new User2("后盾人", 22);
    console.log(lisi2.message()); //后盾人是年轻人

  </script>
</body>

</html>